<?php

class Orden extends BaseModel {

    static $table_name = 'ordenes';
    static $primary_key = 'idorden';
    static $setters = array('_afiliado');
    static $belongs_to = array(
        array(
            '_afiliado',
            'class_name' => 'Afiliado',
            'foreign_key' => 'idafiliado'
        ),
        array(
            '_solicitante',
            'class_name' => 'Profesional',
            'foreign_key' => 'solicitante'
        ),
        array(
            '_plus',
            'class_name' => 'PlusOrden',
            'foreign_key' => 'web_idplus'
        )
    );
    static $has_many = array(
        array(
            '_datos_orden',
            'class_name' => 'DatoOrden',
            'foreign_key' => 'orden'
        )
    );
    static $after_save = array('set_coseguro', 'set_importe');

    public function __construct(array $attributes = array(), $guard_attributes = true, $instantiating_via_find = false, $new_record = true) {
        parent::__construct($attributes, $guard_attributes, $instantiating_via_find, $new_record);
        if ($this->is_new_record()):
            $this->orden_web = 1;
            $this->estado = 1;
            $this->fechaemision = Date('Y-m-d');
            $this->_datos_orden[] = $this->build_dato_orden();
        endif;
    }

    function set_afiliado($afiliado) {
        $this->_afiliado = $afiliado;
        // El plan de la orden debe ser el mismo que el plan del afiliado
        //$this->_plan = $afiliado->_grupo->_plan;
    }

    function get_prestacion() {
        $do = $this->_datos_orden[0];
        return $do->_prestacion;
    }

    function set_prestacion($prestacion) {
        $this->_datos_orden[0]->_prestacion = $prestacion;
    }

    function set_solicitante($solicitante) {
        $this->_solicitante = $solicitante;
        
        // Para las ordenes web, el solicitante siempre será el mismo que el prestador
        $this->_datos_orden[0]->_prestador = $solicitante;
        
        $this->_datos_orden[0]->_tipoprestacion = $solicitante->_especialidad->_tipoprestacion;
        
        
    }

    // Atado con alambre. Guardo una vez para obtener el id 
    // y luego otra vez para poder guardar el código porque está en función del id
    function save($validate=true) {
        if (parent::save($validate)):
            $this->codigo = "{$this->idorden}w";
            parent::save(); 
            foreach ($this->_datos_orden as $dato_orden):
                $dato_orden->_orden = $this;
                $dato_orden->save();
            endforeach;
        endif;
    }

    private function build_dato_orden() {
        return new DatoOrden(array('orden' => $this->idorden));
    }

    function total_orden() {
        $total = 0;
        foreach ($this->datos_orden as $dato_orden):
            $total += $dato_orden->calcular_coseguro();
        endforeach;

        return $total;
    }
    
    function set_coseguro() {
        $this->_datos_orden[0]->coseguro = $this->coseguro();
    }

    function set_importe() {
        $this->_datos_orden[0]->importe = $this->calcular_arancel();
    }


    /* Coseguro a cobrar: Coseguro base * multiplicador de coseguro * multplicador de modalidad * multiplicador web */
    function coseguro() {
        $plan = $this->_afiliado->_grupo->_plan;
        $plus = $this->_plus;
        $arancel = $this->calcular_arancel();
        $multiplicador = GeneralConfig::find_by_nombre("multiplicador_coseguro")->valor();
        $coseguro = $arancel * $multiplicador * $plus->coeficiente * $plan->web_multiplicador;

        if ($this->_solicitante->_carreradiferencial) {
            $coseguro += $arancel * $this->_solicitante->_carreradiferencial->porcentaje;
        }

        return round($coseguro, 0);
    }
    
    private function calcular_arancel() {
        $connection = $this->connection()->connection;
        $id_prestacion = $this->get_prestacion()->idprestacionmedica;
        $stmt = $connection->prepare("CALL calculoMedicas(?, ?)");
        $stmt->execute(array($id_prestacion, 4));
        $result = $stmt->fetch();
        return (float) $result[0];
    }
    
    public function mask_codigo(){
       return str_pad($this->codigo, 10, "0", STR_PAD_LEFT); 
    }
    
    
}

?>
